Zwrot i ryzyko

Najważniejsze miary zwrotów i ryzyka - metody pomiaru i przykłady.

Wariancja portfela

Stopy zwrotu

  • Średnia stopa zwrotu
  • Skumulowana stopa zwrotu
  • Roczna stopa zwrotu
  • Zannualizowana stopa zwrotu - roczna stopa zwrotu odpowiadająca wynikom z dowolnego okresu czasu

Średni zwrot vs zwrot zaanualizowany

  Rok Wartość portfela Zwrot
0 Rok 1 100 None
1 Rok 2 200 100%
2 Rok 3 100 -50%
  • Średnia stopa zwrotu -> (100-50)/2=25 [%]
  • Rzeczywista roczna stopa zwrotu (annualized return) -> 0 [%]

Jak porównywać ze sobą portfele z różnymi okresami inwestycji? Co z kapitalizacją?

Annualizacja

Annualizacja oznacza przekształcenie danych krótkoterminowych w dane całoroczne. Jest to swego rodzaju prognoza, bazująca na ekstrapolacji wyników uzyskanych w jednym okresie. Opiera się ona na założeniu, że gdyby przez resztę roku sytuacja była taka sama jak w pierwszym kwartale, to w całym roku osiągniemy podobny wynik. Przykładowo, jeśli wzrost PKB w danym kwartale wyniósł 1% kdk, to annualizowane tempo wzrostu wyniosło 4,06%.

Annualizacji można dokonywać także na danych z okresów powyżej jednego roku.

\[ A=(1+T)^{1/N}-1 \]

Zwroty skorygowane o ryzyko

DWA PORTFELE DO WYBORU - JEDEN WIĘKSZY ZYSK I RYZYKO, DRUGI OBA MNIEJSZE

DEFINICJA ZWROTU SKORYGOWANEGO O RYZYKO

Wskaźnik kształtu

DEFINICJA

Zmienność roczna

DEFINICJA

Przykład

Nienormalne rozkłady stóp zwrotu

PRZYKŁAD 2 STÓP ZWROTU O TEJ SAMEJ WARIANCJI

Skośność

DEFINICJA, WSPÓŁCZYNNIK PEARSONA

Kurtoza

DEFINICJA, INTUICJA

Alternatywne sposoby pomiaru ryzyka

Wskaźnik Sortino

Definicja, intuicja

Maksimum draw-down

Definicja, intuicja, obrazek, kilka przykładów historycznych

Masimum draw-down w pythonie

Jak starczy czasu: obliczenie wszystkich wskazanych miar dla wybranych danych rzeczywistych + wnioski + porównanie z przyszłością

Analiza portfela względem benchmarku

Aktywna stopa zwrotu

  • Miara efektywności inwestycji względem indeksu referencyjnego
  • Obliczana jako różnica między stopami zwrotu rozważanej inwestycji i benchmarku
  • Odpowiedni dobór wag → wysoka aktywna stopa zwrotu
  • Dla pasywnych funduszy inwestycyjnych i funduszy indeksowych (śledzących) aktywna stopa zwrotu jest interpretowana jako błąd śledzenia

Aktywne wagi

  • Aktywna waga to różnica między wagą w portfelu a wagą w benchmarku

Instrumenty w portfelu inwestycyjnym mogą być:

  • Przeważone - gdy jego aktywna waga jest dodatnia
  • Niedoważone - gdy jego aktywna waga jest ujemna

Implementacja w Pythonie

Wyświetlenie danych

print(portfolio_data.head())
   mean_return  pf_weights  bm_weights             GICS Sector
0     0.146146       0.000         0.0             Health Care
1     0.444411       0.214         0.0             Industrials
2     0.242189       0.000         0.0  Consumer Discretionary
3     0.225074       0.000         0.0  Information Technology
4     0.182541       0.000         0.0             Health Care

Sprawdzenie, czy wagi sumują się do 100%

print(portfolio_data.pf_weights.sum())
100.0

Obliczanie całkowitych zwrotów dla portfela i indeksu referencyjnego

total_return_pf = (portfolio_data['pf_weights']*portfolio_data['mean_return']).sum()
total_return_bm = (portfolio_data['bm_weights']*portfolio_data['mean_return']).sum()

Obliczanie aktywnego zwrotu

active_return = total_return_pf - total_return_bm
print ("%.2f%%" % active_return)
22.58%

Analiza ze względu na sektor

grouped_df=portfolio_data.groupby('GICS Sector').sum()
grouped_df['active_weight']=grouped_df['pf_weights']-grouped_df['bm_weights']
print (grouped_df['active_weight'])
GICS Sector
Consumer Discretionary         20.257
Consumer Staples               -5.176
Energy                          0.000
Financials                     -2.116
Health Care                     2.865
Industrials                     2.465
Information Technology          8.693
Materials                      -2.043
Real Estate                     2.014
Telecommunications Services    -1.367
Utilities                     -25.593
Name: active_weight, dtype: float64

Czynniki ryzyka

  • Cechy instrumentów finansowych zawartych w portfelu, wpływające na zmianę jego wartości - stratę lub zysk
  • Dzielimy je na:
    • makroekonomiczne: stopy procentowe, kursy walut, przepisy prawne, etc.
    • strategiczne: wielkość, wartość, zmienność, dynamika, etc.

Zastosowania czynników ryzyka

Implementacja w Pythonie

Wyświetlenie danych

df.head(3)
         date    S&P500   WML  value_factor  portfolio
0  2016-01-04 -1.530373 -1.69         -1.53  -1.651745
1  2016-01-05  0.201223  0.38          0.10   0.408161
2  2016-01-06 -1.311540  1.27         -1.22   0.325555

Obliczamy współczynniki korelacji między zwrotami S&P500 a czynnikami dynamiki i wartości

df['correlation_mom']=df['S&P500'].rolling(20).corr(df['WML'])
df['correlation_value']=df['S&P500'].rolling(20).corr(df['value_factor'])

Generujemy wykres korelacji w czasie

plt.clf()
plt.plot(df['correlation_mom'], label = "momentum")
plt.plot(df['correlation_value'], label = "value")
plt.title("Korelacja między czynnikami ryzyka a stopą zwrotu indeksu S&P500")
plt.legend()
plt.show()

Teraz sprawdźmy jak czynnik wartości wpływa na zmianę wartości portfela inwestycyjnego

Wyświetlenie danych

factor_data.head(3)
    WML  value_factor  portfolio
0 -1.69         -1.53  -1.651745
1  0.38          0.10   0.408161
2  1.27         -1.22   0.325555
factor_data.corr()
                   WML  value_factor  portfolio
WML           1.000000     -0.363237   0.001012
value_factor -0.363237      1.000000   0.767663
portfolio     0.001012      0.767663   1.000000
plt.clf()
factor_data['correlation_value']=factor_data['portfolio'].rolling(5).corr(factor_data['value_factor'])
factor_data['correlation_value'].plot()
plt.legend()
plt.show()

Fama French Multi Factor Model

\[ R_{pf}=\alpha + \beta_mMKT + \beta_s SMB + \beta_h HML \]

  • MKT (market return) to różnica między stopą zwrotu rynkowego a stopą wolną od ryzyka
  • SML (small minus big) czynnik rozmiaru, różnica między stopami zwrotów małych i dużych spółek
  • HML (high minus low) czynnik wartości, różnica między stopami zwrotów spółek high value i low value
  • Współczynniki \(\beta_{(.)}\) mowią nam w jakim stopniu konkretny czynnik wyjaśnia zmiany stopy zwrotu z naszego portfela (współczynniki regresji)
  • \(\alpha\) reprezentuje nadwyżkowy zwrot, który nie jest wyjaśniony przez model (czynnik losowy)

Implementacja w Pythonie

Wyświetlenie danych

factor_returns.head(3)
   Mkt-RF   SMB   HML   RF  pf_returns
0   -1.59 -0.83  0.53  0.0   -1.651745
1    0.12 -0.22  0.01  0.0    0.408161
2   -1.35 -0.12  0.00  0.0    0.325555

Macierz korelacji dla danych w tabeli

factor_returns.corr()
              Mkt-RF       SMB       HML        RF  pf_returns
Mkt-RF      1.000000  0.331250  0.099800  0.087073    0.738586
SMB         0.331250  1.000000 -0.108081  0.076750    0.162303
HML         0.099800 -0.108081  1.000000 -0.049019   -0.237647
RF          0.087073  0.076750 -0.049019  1.000000    0.039383
pf_returns  0.738586  0.162303 -0.237647  0.039383    1.000000

Definiujemy model regresji liniowej

model = sm.regression.linear_model.OLS(factor_returns['pf_returns'], factor_returns[['Mkt-RF','SMB', 'HML']]).fit()

Podsumowanie modelu

model.summary()
OLS Regression Results
Dep. Variable: pf_returns R-squared (uncentered): 0.657
Model: OLS Adj. R-squared (uncentered): 0.653
Method: Least Squares F-statistic: 158.8
Date: Wed, 26 Mar 2025 Prob (F-statistic): 1.55e-57
Time: 09:19:18 Log-Likelihood: -185.67
No. Observations: 252 AIC: 377.3
Df Residuals: 249 BIC: 387.9
Df Model: 3
Covariance Type: nonrobust
coef std err t P>|t| [0.025 0.975]
Mkt-RF 0.8234 0.040 20.627 0.000 0.745 0.902
SMB -0.2272 0.064 -3.545 0.000 -0.353 -0.101
HML -0.4826 0.056 -8.611 0.000 -0.593 -0.372
Omnibus: 143.224 Durbin-Watson: 1.925
Prob(Omnibus): 0.000 Jarque-Bera (JB): 1746.552
Skew: 1.972 Prob(JB): 0.00
Kurtosis: 15.279 Cond. No. 1.89


Notes:
[1] R² is computed without centering (uncentered) since the model does not contain a constant.
[2] Standard Errors assume that the covariance matrix of the errors is correctly specified.
b1, b2, b3 = model.params

print ('Współczynniki dla poszczególnych czynników:\nMkt-Rf: %f\nSMB: %f\nHML: %f' %  (b1, b2, b3))
Współczynniki dla poszczególnych czynników:
Mkt-Rf: 0.823443
SMB: -0.227198
HML: -0.482598

Narzędzia do analizy portfela inwestycyjnego

  • Backtesting - testowanie modelu na danych historycznych
  • Performance attrubution - analiza składowych wyników inwestycyjnych
  • PyFolio - darmowe narzędzie do przeprowadzania kompleksowych analiz portfela